package com.shujia.day08;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Demo07ListSort {
    public static void main(String[] args) {
        /*
            TODO 排序操作:
                1. List中的排序,可以使用 List对象的sort方法
                            需要传入一个  Comparator 实例对象 要实现其 compare 方法  第一个值减去第二个值就是升序 否则就是降序
                        或者对于基本数据类型包装类 传入 null 即可
                2.Arrays对自定义类数组的排序
                        需要对自定义类实现 Comparable 接口,并实现其 compareTo方法
                            当前对象减去传入的对象 就是升序 反之降序
         */
        List<Integer> integers = new ArrayList<>();
        integers.add(3);
        integers.add(5);
        integers.add(6);
        integers.add(2);
        integers.add(1);
        integers.add(7);
        integers.add(8);
        integers.add(4);
        integers.add(9);

        /*
            sort方法需要传入 Comparator<? super E> c 参数
                排序需要给定规则,规则是由 Comparator 的实现对象决定的
                而 interface Comparator<T> {  为一个接口  => 不能构建具体的对象
                    方式1:可以创建一个类 实现该接口,并创建实现类对象传给 sort
                    方式2:匿名内部类实现
                    方式3:对于基本类型数据的包装类,做排序时,可以直接传入null值
         */
//        integers.sort(new IntSort());

        /*

         */

        integers.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer thisObj, Integer otherObj) {
                return -(thisObj - otherObj);
            }
        });
//        integers.sort(null);
        System.out.println(integers);


//        String[] allStr = new String[3];
//        allStr[0] = "10";
//        allStr[1] = "8";
//        allStr[2] = "1";
//
//        Arrays.sort(allStr);
//        // 字典顺序比较的
//        System.out.println(Arrays.toString(allStr));


        Tea[] teas = new Tea[3];
        teas[0] =  new Tea("张三",19,3);
        teas[1] =  new Tea("李四",19,4);
        teas[2] =  new Tea("王五",21,4);
        /*
            java.lang.ClassCastException: com.shujia.day08.Tea cannot be cast to java.lang.Comparable
            类型转换错误 => 给定的是自定义对象, Arrays并不知道具体的排序方式
            现在底层代码是将 每个Tea对象强制类型 转换成 Comparable 对象 并调用其 compareTo 方法
                现在 interface Comparable 是一个接口 实现其 compareTo
         */
        Arrays.sort(teas);
        System.out.println(Arrays.toString(teas));


    }
}

// Comparator<T> 其中T表示要比较的数据类型
class IntSort implements Comparator<Integer>{

    @Override
    public int compare(Integer thisObj, Integer otherObj) {
        /*
            thisObj - otherObj 是自然升序的方式进行排序
         */
        return -(thisObj - otherObj);
    }
}

class Tea implements Comparable<Tea>{
    String name;
    int age;
    int year;

    public Tea(String name, int age, int year) {
        this.name = name;
        this.age = age;
        this.year = year;
    }


    @Override
    public int compareTo(Tea other) {
        /*
            定义两个对象的比较逻辑:
                 1.先比较工作年限 年限相同再比较年龄
         */
        // 年限相减结果为 0 表示相同
        int compareRes = this.year - other.year == 0 ? this.age - other.age : this.year - other.year;
        return - compareRes;
    }

    @Override
    public String toString() {
        return "Tea{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", year=" + year +
                '}';
    }
}

